﻿using System;
using System.IO;
using System.Linq;
using System.Security.Cryptography;

namespace Static
{
	/// <summary>
	/// Класс, в котором реализуются статические методы.
	/// </summary>
	public static class StaticMetods
	{
		/// <summary>
		/// Расчет контрольной суммы файла по заданному пути.
		/// </summary>
		/// <param name="path">Путь к файлу.</param>
		/// <returns>Расчитанная контрольная сумма в формате строки.</returns>
		public static string ComputeMd5Checksum(string path)
		{
			if (System.IO.File.Exists(path))
			{
				using (FileStream fs = System.IO.File.OpenRead(path))
				{
					MD5 md5 = new MD5CryptoServiceProvider();
					byte[] compute = md5.ComputeHash(fs);
					md5.Dispose();
					return BitConverter.ToString(compute).ToString().Replace("-", string.Empty);
				}
			}
			else
			{
				throw new FileNotFoundException(path);
			}
		}

		/// <summary>
		/// Метод установки атрибута Normal, для папки по заданному пути. Создан, для предотвращения ошибки - UnauthorizedAccessException, при удалении папки.
		/// </summary>
		/// <param name="path">Путь к папке.</param>
		/// <param name="fileAttribute">Устанавливаемый атрибут.</param>
		public static void SetAttribute(string path, FileAttributes fileAttribute)
		{
			DirectoryInfo d = new DirectoryInfo(path);
			////Елси папка не доступна-генерируем исключение.
			if (!d.Exists)
			{
				throw new DirectoryNotFoundException();
			}

			FileInfo[] fis = d.GetFiles(".", SearchOption.AllDirectories);
			foreach (FileInfo fi in fis)
			{
				fi.Attributes = fileAttribute;
			}
		}

		/// <summary>
		/// Метод возвращающий размер папки в байтах.
		/// </summary>
		/// <param name="path">Путь к папке.</param>
		/// <returns>Размер папки в байтах.</returns>
		public static long DirSize(string path)
		{
			DirectoryInfo d = new DirectoryInfo(path);

			////Елси папка не доступна-возвращаем 0.
			if (!d.Exists)
			{
				return 0;
			}

			FileInfo[] files = d.GetFiles(".", SearchOption.AllDirectories);

			return files.Sum(file => file.Length);
		}
	}
}
